package com.steven.sync;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * ReentrantLock 可以trylock 试图申请锁
 *   lock.lockInterruptibly();: 可以对interrupt（）做出响应
 *   允许在等待时由其它线程调用等待线程的Thread.interrupt方法来中断等待线程的等待而直接返回，这时不用获取锁，而会抛出一个InterruptedException。
 * 可以公平锁: 公平：如果等待队列有线程等待就排队等候; 不公平：线程上来就直接抢锁
 */
public class ReentrantLock_test {


    ReentrantLock lock = new ReentrantLock();

    public void m1(){
        try{
            lock.lock();
            for (int i = 0; i < 10; i++) {
                TimeUnit.SECONDS.sleep(1);
                System.out.println(i);
            }
        }catch (Exception e){

        }finally {
            lock.unlock();
        }
    }
    public void m2(){
        boolean b=false;
        try{
//            lock.lock();
//            尝试五秒钟之内申请锁，如果申请不成功就放弃
             b = lock.tryLock(5, TimeUnit.SECONDS);
            System.out.println("m2"+b);
        }catch (Exception e){

        }finally {
            if(b){
                lock.unlock();
            }
        }
    }

    public static void main(String[] args) {
        ReentrantLock_test reentrantLockTest = new ReentrantLock_test();
        new Thread(reentrantLockTest::m1).start();
        new Thread(reentrantLockTest::m2).start();

    }
}
